package tec;
import java.lang.IllegalStateException;
import java.util.ArrayList;
import java.util.Iterator;
//import java.util.Collection;

public class Autobus 
    implements Bus, Transport {
    
    
    private final JaugeNaturel nbAssis;
    private final JaugeNaturel nbDebout;
    private int arret;
    private ArrayList<Passager>array_Passagers = new ArrayList<Passager>();
    
    
    public Autobus(int nbPlaceAssise, int nbPlaceDebout) {
	array_Passagers = new ArrayList<Passager>(nbPlaceAssise + nbPlaceDebout);//Type passager
	nbAssis =  new JaugeNaturel(0,nbPlaceAssise,0);
	nbDebout = new JaugeNaturel(0,nbPlaceDebout,0);
	arret = 1;
	
    }
    
    //itérateur sur un passager dès qu'il faut parcourir.
    
    public boolean aPlaceAssise() {
	return !(nbAssis.estRouge());
    }

    public boolean aPlaceDebout() {
	return !(nbDebout.estRouge());
    }
    
    public void demanderPlaceAssise(Passager p) { 
	nbAssis.incrementer();
	array_Passagers.add(p);
	p.accepterPlaceAssise();
    }
    
    public void demanderPlaceDebout(Passager p) {
	nbDebout.incrementer();
	array_Passagers.add(p);
	p.accepterPlaceDebout();
      
    }
    
    public void demanderSortie(Passager p) {
	Iterator<Passager> it = array_Passagers.iterator();
	if(p.estAssis()){
	    nbAssis.decrementer();
	    p.accepterSortie();
	}
	else{
	    if(p.estDebout()){
		nbDebout.decrementer();
		p.accepterSortie();
	    }
	}
	while(it.hasNext()){
	    if(it.next() == p)
		it.remove();
	}
	p.accepterSortie();
    }
    
   
    
    
    
    //les parametres sont consideres valides
    public void demanderChangerEnDebout(Passager p) {
	nbAssis.decrementer();
	nbDebout.incrementer();
	p.accepterPlaceDebout();
    }
    
    public void demanderChangerEnAssis(Passager p) {
	nbAssis.incrementer();
	nbDebout.decrementer();
	p.accepterPlaceAssise();
	
    }

    public void allerArretSuivant() throws TecInvalidException { 
	int i;
	this.arret++;
	Iterator<Passager> place = array_Passagers.iterator();
	Bus B = new Bus() {
		
		private void nouvelleSortie(Iterator<Passager> place, Passager aEnlever) {
		    while(place.hasNext()){
			if(place.next() == aEnlever)
			    place.remove();
		    }
		}
		
		
		void demanderSortie(Passager p) {
		    Autobus Autobus = new Autobus();
		    Iterator<Passager> it = arrayPassagers.iterator();
		    if(p.estAssis()){
			nbAssis.decrementer();
			p.accepterSortie();
		    }
		    if(p.estDebout()){
			nbDebout.decrementer();
			p.accepterSortie();
		    }
		    p.accepterSortie();
		}
		
		
		void demanderPlaceAssise(Passager p) { 
		    if(!p.estDehors())
			throw new IllegalArgumentException("IllegalStateException: demander place assise");   
		}
		
		void demanderPlaceDebout(Passager p) {
		    if(!p.estDehors())
			throw new IllegalArgumentException("IllegalStateException: demander place debout");	    
		}
		
		
		boolean aPlaceAssise() {
		    return (aPlaceAssise());
		}
		
		boolean aPlaceDebout() {
		    return (aPlaceDebout());
		}
		
	     	
		void allerArretSuivant() throws TecInvalidException{
		    Autobus.this.allerArretSuivant();
		}		
		
	    };
	
		
	for(i=0; i < array_Passagers.size(); i++){
	    if(arrayPassagers.get(i)!=null)
		try{
		    array_Passagers.get(i).nouvelArret(B, arret);}
		catch(IllegalStateException e){
		    throw new TecInvalidException(e);}    
	}  
    }  
    
	    /*
    // pourquoi passager en parametre ?
	    private ArrayList chercherVide(Passager q){
	
	    Iterator<Passager>it = array_Passagers.iterator();
	    Passager p;
	    while(it.hasNext()){
		p = it.next();
		if(q == p)
		    array_Passagers.remove(p);
	}
	return array_Passagers;
    }
};
	
	

    
    //a modifier
    private Passager chercherPassager(ArrayList l){
	int i = 0;
	Iterator<Passager>it = l.iterator();
	Passager p;
	while(it.hasNext()){
	    i++;
	    p = it.next();
	    if(p == l.get(i))
		return p;
	}
	return p;
    }
	    */
    
    @Override
    public String toString() {
	
	return "[arret:" + arret + ", assis:" + nbAssis.toString() + ", debout:" + nbDebout.toString() + "]";
    }
    
}
